package com.liang.liangrpccore;

import com.liang.liangrpccore.config.RpcConfig;
import com.liang.liangrpccore.constant.RpcConstant;
import com.liang.liangrpccore.utils.ConfigUtil;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class RpcApplication {

    /**
     * 双检锁单例模式
     */
    private static volatile RpcConfig rpcConfig;

    /**
     * 框架初始化，支持传入自定义配置
     * @param newRpcConfig 自定义配置
     */
    private static void init(RpcConfig newRpcConfig){
        rpcConfig = newRpcConfig;
        log.info("rpc init, config = {}", newRpcConfig.toString());
    }

    /**
     * 框架初始化
     */

    public static void init() {
        RpcConfig newRpcConfig;
        try {
            newRpcConfig = ConfigUtil.loadConfig(RpcConfig.class, RpcConstant.DEFAULT_CONFIG_PREFIX);
        } catch (Exception e) {
            // 加载失败，使用默认值
            newRpcConfig = new RpcConfig();
        }
        init(newRpcConfig);
    }

    /**
     * 使用双检锁单例模式获取配置
     * @return 配置
     */

    public static RpcConfig getRpcConfig() {
       if (rpcConfig == null){
           synchronized (RpcApplication.class) {
               if (rpcConfig == null){
                   init();
               }
           }
       }
       return rpcConfig;
    }
}
